package com.aiolos.hadoop.mapreduce.wc;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * KEYIN: Map任务读数据的key类型，一般情况下是offset，是每行数据起始位置的偏移量。一般为long类型
 * VALUEIN: Map任务读数据的value类型，其实就是一行行的字符串，String类型
 *
 *
 * hello world welcome
 * hello welcome
 *
 *
 * KEYOUT: map方法自定义实现输出的key的类型,String
 * VALUEOUT: map方法自定义实现输出的value的类型,Integer
 *
 *
 * 词频统计：相同单词的次数
 * (word,1)
 *
 * Long、String、Integer是Java里面的数据类型
 * Hadoop自定义类型：支持序列化和反序列化(用于分布式的网络传输)
 * 所以使用LongWritable、Text、IntWritable
 *
 */
public class WordCountMap extends Mapper<LongWritable,Text, Text, IntWritable> {

    /**
     * 重写Mapper中的map方法
     *    map方法中基本做的都是如下两件事情：
     *    1. 把value对应的行数据按照指定的分隔符拆开
     *    2. 为各单词的设置次数为1
     * @param key
     * @param value
     * @param context
     */
    @Override
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException {

        //1.把value对应的行数据按照指定的分隔符拆开
        String[] words = value.toString().split(" ");
        //2.为各单词的设置次数为1,实现 (hello,1) (world,1) 效果
        for(String word : words){
            //3. 通过上下文写出去，交给Reduce处理
            context.write(new Text(word.toLowerCase()),new IntWritable(1));
        }
    }
}
